package l1j.server.server.model.skill;

import java.util.concurrent.ScheduledFuture;
import java.util.logging.Level;
import java.util.logging.Logger;

import l1j.server.Thread.GeneralThreadPool;
import l1j.server.server.model.L1Character;

/**
 * 技能效果時間軸
 *
 * @author daien
 *
 */
public class L1SkillTimerTimerImpl implements L1SkillTimer, Runnable {

	private static Logger _log = Logger.getLogger(L1SkillTimerTimerImpl.class
			.getName());

	private ScheduledFuture<?> _future = null;

	private final L1Character _cha;

	private final int _timeMillis;

	private final int _skillId;

	private int _remainingTime;

	/**
	 * 技能效果時間軸
	 *
	 * @param cha
	 *            執行者
	 * @param skillId
	 *            技能編號
	 * @param timeMillis
	 *            技能時間(毫秒)
	 */
	public L1SkillTimerTimerImpl(final L1Character cha, final int skillId,
			final int timeMillis) {
		this._cha = cha;
		this._skillId = skillId;
		this._timeMillis = timeMillis;

		this._remainingTime = this._timeMillis / 1000;
	}

	// @Override
	@Override
	public void begin() {
		this._future = GeneralThreadPool.getInstance().scheduleAtFixedRate(
				this, 1000, 1000);
	}

	// @Override
	@Override
	public void end() {
		this.kill();
		try {
			L1SkillStop.stopSkill(this._cha, this._skillId);
		} catch (final Throwable e) {
			_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
		}
	}

	// @Override
	@Override
	public int getRemainingTime() {
		return this._remainingTime;
	}

	// @Override
	@Override
	public void kill() {
		try {
			if (this._future != null) {
				// 试图取消对此任务的执行。
				// 如果任务已完成、或已取消，或者由于某些其他原因而无法取消，则此尝试将失败。
				// 当调用 cancel 时，如果调用成功，而此任务尚未启动，则此任务将永不运行。
				// 如果任务已经启动，则 mayInterruptIfRunning
				// 参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。

				// 此方法返回后，对 isDone() 的后续调用将始终返回 true。
				// 如果此方法返回 true，则对 isCancelled() 的后续调用将始终返回 true。
				// 参数：
				// mayInterruptIfRunning - 如果应该中断执行此任务的线程，则为
				// true；否则允许正在运行的任务运行完成
				// 返回：
				// 如果无法取消任务，则返回 false，这通常是由于它已经正常完成；否则返回 true
				this._future.cancel(false);
			}
		} catch (final Throwable e) {
			_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
		}
	}

	// @Override
	@Override
	public void run() {
		this._remainingTime--;
		if (this._remainingTime <= 0) {
			this._cha.removeSkillEffect(this._skillId);
		}
	}

}
